/*
 * SPDX-FileCopyrightText: 2023 Gunar Schorcht
 * SPDX-License-Identifier: LGPL-2.1-only
 */

#pragma once

/**
 * @ingroup     boards_esp32c3_wemos_mini
 * @brief       Peripheral configurations for the Wemos ESP32-C3 mini board
 * @{
 *
 * For detailed information about the peripheral configuration for ESP32-C3
 * boards, see section \ref esp32_peripherals "Common Peripherals".
 *
 * There are two board versions available on the market with a different pinout
 * of the ADC channels and the SPI interface. Which version is used is
 * determined by activating a pseudo module for the corresponding version:
 *
 * - v1.0.0, module `esp32c3_wemos_mini_v1_0_0`
 * - v2.1.0, module `esp32c3_wemos_mini_v2_1_0` (default)
 *
 * To specify which board version is used, simply add the variable
 * definition `USEMODULE=...` to the make command line, for example:
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * USEMODULE=esp32c3_wemos_mini_v1_0_0 BOARD=esp32c3-wemos-min make ...
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * If the board version is not specified, version v2.1.0 is used by default.
 *
 * @note
 * Most definitions can be overridden by an \ref esp32_application_specific_configurations
 * "application-specific board configuration" if necessary.
 *
 * @file
 * @author      Gunar Schorcht <gunar@schorcht.net>
 */

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @name    ADC and DAC channel configuration
 * @{
 */
/**
 * @brief   Declaration of GPIOs that can be used as ADC channels
 *
 * For generic boards, all ADC pins that have broken out are declared as ADC
 * channels.
 *
 * @note As long as the GPIOs listed in ADC_GPIOS are not initialized as ADC
 * channels with the `adc_init` function, they can be used for other
 * purposes.
 */
#ifndef ADC_GPIOS
#define ADC_GPIOS   { GPIO0, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5 }
#endif
/** @} */

/**
 * @name   I2C configuration
 *
 * For generic boards, only one I2C interface I2C_DEV(0) is defined.
 *
 * The GPIOs listed in the configuration are only initialized as I2C signals
 * when module `periph_i2c` is used. Otherwise they are not allocated and
 * can be used for other purposes.
 *
 * @{
 */
#ifndef I2C0_SPEED
#define I2C0_SPEED  I2C_SPEED_FAST  /**< I2C bus speed of I2C_DEV(0) */
#endif
#ifndef I2C0_SCL
#define I2C0_SCL    GPIO10          /**< SCL signal of I2C_DEV(0) */
#endif
#ifndef I2C0_SDA
#define I2C0_SDA    GPIO8           /**< SDA signal of I2C_DEV(0) */
#endif
/** @} */

/**
 * @name   PWM channel configuration
 *
 * One PWM device is configured. It uses all GPIOs that are not defined as
 * I2C, SPI or UART for this board.
 *
 * @note As long as the according PWM device is not initialized with
 * the `pwm_init`, the GPIOs declared for this device can be used
 * for other purposes.
 *
 * @{
 */

/**
 * @brief Declaration of the channels for device PWM_DEV(0),
 *        at maximum PWM_CHANNEL_NUM_DEV_MAX.
 */
#ifndef PWM0_GPIOS
#  ifdef MODULE_ESP32C3_WEMOS_MINI_V1_0_0
#    define PWM0_GPIOS  { GPIO1, GPIO6, GPIO7 }
#  else /* MODULE_ESP32C3_WEMOS_MINI_V2_1_0 */
#    define PWM0_GPIOS  { GPIO2, GPIO6, GPIO3 }
#  endif
#endif

/** @} */

/**
 * @name    SPI configuration
 *
 * @note
 * - For compatibility with [Wemos D1 mini shields]
 *   (https://www.wemos.cc/en/latest/d1_mini_shield/index.html), FSPI signals
 *   do not use direct I/O (IOMUX pin functions) but are routed through the
 *   GPIO matrix as required for D1 mini shields. This limits the SPI clock
 *   speed to 26 MHz instead of 80 MHz SPI clock speed.
 * - The GPIOs listed in the configuration are not initialized as SPI
 *   signals until the corresponding SPI interface is used for the first time
 *   by either calling the `spi_init_cs` function or the `spi_acquire`
 *   function. That is, they are not allocated as SPI signals before and can
 *   be used for other purposes as long as the SPI interface is not used.
 *
 * @{
 */
#ifdef MODULE_ESP32C3_WEMOS_MINI_V1_0_0
#ifndef SPI0_CTRL
#define SPI0_CTRL   FSPI    /**< FSPI is used as SPI_DEV(0) */
#endif
#ifndef SPI0_SCK
#define SPI0_SCK    GPIO2   /**< FSPI SCK signal routed to GPIO2 in GPIO matrix */
#endif
#ifndef SPI0_MISO
#define SPI0_MISO   GPIO3   /**< FSPI SCK signal routed to GPIO3 in GPIO matrix */
#endif
#ifndef SPI0_MOSI
#define SPI0_MOSI   GPIO4   /**< FSPI SCK signal routed to GPIO4 in GPIO matrix */
#endif
#ifndef SPI0_CS0
#define SPI0_CS0    GPIO5   /**< CS pin controlled in software */
#endif
#else /* MODULE_ESP32C3_WEMOS_MINI_V2_1_0 */
#ifndef SPI0_CTRL
#define SPI0_CTRL   FSPI    /**< FSPI is used as SPI_DEV(0) */
#endif
#ifndef SPI0_SCK
#define SPI0_SCK    GPIO1   /**< FSPI SCK signal routed to GPIO2 in GPIO matrix */
#endif
#ifndef SPI0_MISO
#define SPI0_MISO   GPIO0   /**< FSPI SCK signal routed to GPIO3 in GPIO matrix */
#endif
#ifndef SPI0_MOSI
#define SPI0_MOSI   GPIO4   /**< FSPI SCK signal routed to GPIO4 in GPIO matrix */
#endif
#ifndef SPI0_CS0
#define SPI0_CS0    GPIO5   /**< CS pin controlled in software */
#endif
#endif
/** @} */

/**
 * @name   UART configuration
 *
 * ESP32-C3 provides 2 UART interfaces at maximum:
 *
 * UART_DEV(0) uses fixed standard configuration.<br>
 * UART_DEV(1) is not used.<br>
 *
 * @{
 */
#define UART0_TXD   GPIO21  /**< direct I/O pin for UART_DEV(0) TxD, can't be changed */
#define UART0_RXD   GPIO20  /**< direct I/O pin for UART_DEV(0) RxD, can't be changed */

/** @} */

#ifdef __cplusplus
} /* end extern "C" */
#endif

/* include common peripheral definitions as last step */
#include "periph_conf_common.h"

/** @} */
